home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / game / misc / Skeleton.lha / Skeleton / files / skeleton.asm < prev    next >
Assembly Source File  |  2002-09-06  |  19KB  |  1,077 lines

  1.     PROCESSOR 6502
  2.     INCLUDE    "VCS.H"
  3.  
  4.     INCLUDE "SKELRAM.ASM"
  5.  
  6.     SEG    ROM
  7.     ORG    $1000
  8.  
  9.     DC.B    "Skeleton (c)2002 Eric Ball",0
  10.  
  11. KERN0    STA    WSYNC        ;69-0
  12.     LDA    (MAZE0L),Y    ;-5
  13.     STA    PF0        ;-8
  14.     STX    PF1        ;-11
  15.     STX    PF2        ;-14
  16.     LDX    #5        ;-16
  17. WAIT0    DEX            ;+2
  18.     BNE    WAIT0        ;+2/3
  19.     LDA    (MAZE0R),Y    ;40-45
  20.     STA    PF0        ;-48
  21.     INY            ;-50
  22.     LDA    WALL        ;-53
  23.     CMP    #1        ;-55
  24.     BEQ    WALL15        ;-57/58
  25.     CPY    #20        ;-59
  26.     BNE    KERN0        ;-61/62
  27.     BEQ    KERN20        ;-64
  28. WALL15    CPY    #15        ;58-60
  29.     BCC    KERN0        ;-62/63
  30.     DEX            ;-64
  31.     CPY    #20        ;-66
  32.     BNE    KERN0        ;-68/69
  33.  
  34. WALL20    STA    WSYNC        ;44-0
  35.     LDA    #$80        ;-2
  36.     STA    PF0        ;-5
  37.     LDA    #$00        ;-7
  38.     STA    PF1        ;-10
  39.     STA    PF2        ;-13
  40.     LDX    #170-20        ;-15
  41.     JSR    XWALL        ;-21
  42.     DEX            ;36-38
  43.     JMP    KERN170        ;-41
  44.  
  45. KERN20    STA    WSYNC        ;72-0
  46.     TXA            ;-2
  47.     AND    #$0F        ;-4
  48.     ORA    (MAZE1L),Y    ;-9
  49.     STA    PF1        ;-12
  50.     STX    PF2        ;-15
  51.     LDX    #$80        ;-17
  52.     STX    PF0        ;-20
  53.     LDX    #4        ;-22
  54. WAIT20    DEX            ;+2
  55.     BNE    WAIT20        ;+2/3
  56.     AND    #$0F        ;41-43
  57.     ORA    (MAZE1R),Y    ;-48
  58.     STA    PF1        ;-51
  59.     INY            ;-53
  60.     LDA    WALL        ;-56
  61.     CMP    #2        ;-58
  62.     BEQ    WALL35        ;-60/61
  63.     CPY    #40        ;-62
  64.     BNE    KERN20        ;-64/65
  65.     BEQ    KERN40        ;-67
  66. WALL35    CPY    #35        ;61-63
  67.     BCC    KERN20        ;-65/66
  68.     DEX            ;-67
  69.     CPY    #40        ;-69
  70.     BNE    KERN20        ;-71/72
  71.  
  72. WALL40    STA    WSYNC        ;41-0
  73.     LDA    #$10        ;-2
  74.     STA    PF1        ;-5
  75.     LDA    #$00        ;-7
  76.     STA    PF2        ;-10
  77.     LDX    #150-40        ;-12
  78.     JSR    XWALL        ;-18
  79.     DEX            ;36-38
  80.     JMP    KERN150        ;-41
  81.  
  82. KERN40    STA    WSYNC        ;72-0
  83.     LDA    (MAZE2L),Y    ;-5
  84.     STA    PF1        ;-8
  85.     STX    PF2        ;-11
  86.     LDX    #5        ;-13
  87.     CPY    SKELTOP        ;-15
  88.     BCC    WAIT40        ;-17/18
  89.     LDA    (SKEL0),Y    ;-22
  90.     STA    GRP0        ;-24
  91.     LDA    (SKEL1),Y    ;-29
  92.     STA    GRP1        ;-32
  93.     LDX    #2        ;-34
  94. WAIT40    DEX            ;+2
  95.     BNE    WAIT40        ;+2/3
  96.     LDA    (MAZE2R),Y    ;42/43-47/48
  97.     STA    PF1        ;-50/51
  98.     INY            ;-53
  99.     LDA    WALL        ;-56
  100.     CMP    #3        ;-58
  101.     BEQ    WALL55        ;-60/61
  102.     CPY    #60        ;-62
  103.     BNE    KERN40        ;-64/65
  104.     LDA    #$00        ;-66
  105.     BEQ    KERN60        ;-69
  106. WALL55    CPY    #55        ;61-63
  107.     BCC    KERN40        ;-65/66
  108.     DEX            ;-67
  109.     CPY    #60        ;-69
  110.     BNE    KERN40        ;-71/72
  111.  
  112. WALL60    STA    WSYNC        ;41-0
  113.     LDA    #$11        ;-2
  114.     STA    PF1        ;-5
  115.     LDA    #$00        ;-7
  116.     STA    PF2        ;-10
  117.     LDX    #130-60        ;-12
  118.     JSR    XWALL        ;-18
  119.     DEX            ;36-38
  120.     JMP    KERN130        ;-41
  121.  
  122. PVIEW4    LDA    $00,X        ; right/left step 2 subroutine
  123.     BEQ    PVIEW5        ; open found, check next
  124.     LDA    #>TYPE0        ; closed, show wall
  125.     BNE    PVIEW7
  126. PVIEW5    LDA    $01,X        ; is next open too?
  127.     BEQ    PVIEW6
  128.     LDA    #>TYPE1        ; open, show hole
  129.     BNE    PVIEW7
  130. PVIEW6    LDA    #>TYPE2        ; both open, show Y
  131. PVIEW7    INX            ; next test position
  132.     STA    $0001,Y        ; pointer MSB to RAM
  133.     LDA    #$00
  134.     STA    $0000,Y        ; LSB = 0
  135.     INY            ; next pointer position
  136.     INY
  137.     RTS
  138.  
  139. WAIT60    LDX    #3        ;20-22
  140. WAIT61    DEX            ;+2
  141.     BNE    WAIT61        ;+2/3
  142.     BEQ    KERN61        ;36-39
  143.  
  144. KERN60    STA    WSYNC        ;70-0
  145.     AND    #$F0        ;-2
  146.     ORA    (MAZE3L),Y    ;-7
  147.     STA    PF2        ;-10
  148.     LDX    #$11        ;-12
  149.     STX    PF1        ;-15
  150.     CPY    SKELTOP        ;-17
  151.     BCC    WAIT60        ;-19/20
  152.     TAX            ;-21
  153.     LDA    (SKEL0),Y    ;-26
  154.     STA    GRP0        ;-29
  155.     LDA    (SKEL1),Y    ;-34
  156.     STA    GRP1        ;-37
  157.     TXA            ;-39
  158. KERN61    AND    #$F0        ;39-41
  159.     ORA    (MAZE3R),Y    ;-46
  160.     STA    PF2        ;-49
  161.     INY            ;-51
  162.     LDA    WALL        ;-54
  163.     CMP    #4        ;-56
  164.     BEQ    WALL75        ;-58/59
  165.     CPY    #80        ;-60
  166.     BNE    KERN60        ;-62/63
  167.     BEQ    KERN80        ;-65
  168. WALL75    CPY    #75        ;59-61
  169.     BCC    KERN60        ;-63/64
  170.     LDA    #$FF        ;-65
  171.     CPY    #80        ;-67
  172.     BNE    KERN60        ;-69/70
  173.  
  174. KERN80    STA    WSYNC        ;36-0
  175.     LDA    #$08        ;-2
  176.     STA    PF2        ;-5
  177.     LDX    #110-80        ;-7
  178.     JSR    XWALL        ;-13
  179.     DEX            ;36-38
  180.  
  181. KERN110    STA    WSYNC        ;56-0
  182.     LDA    (MAZE3L),Y    ;-5
  183.     STA    PF2        ;-8
  184.     LDX    #4        ;-10
  185.     CPY    SKELBOT        ;-12
  186.     BCS    WAIT110        ;-14/15
  187.     LDA    (SKEL0),Y    ;-19
  188.     STA    GRP0        ;-22
  189.     LDA    (SKEL1),Y    ;-27
  190.     STA    GRP1        ;-30
  191.     LDX    #1        ;-32
  192. WAIT110    DEX            ;+2
  193.     BPL    WAIT110        ;+2/3
  194.     LDA    (MAZE3R),Y    ;39/41-44/46
  195.     STA    PF2        ;-47/49
  196.     INY            ;-51
  197.     CPY    #130        ;-53
  198.     BNE    KERN110        ;-55/56
  199.  
  200. KERN130    STA    WSYNC        ;64-0
  201.     LDA    (MAZE2L),Y    ;-5
  202.     STA    PF1        ;-8
  203.     STX    PF2        ;-10
  204.     LDX    #4        ;-12
  205.     CPY    SKELBOT        ;-14
  206.     BCS    WAIT130        ;-16/17
  207.     LDA    (SKEL0),Y    ;-21
  208.     STA    GRP0        ;-24
  209.     LDA    (SKEL1),Y    ;-29
  210.     STA    GRP1        ;-32
  211.     LDX    #1        ;-34
  212. WAIT130    DEX            ;+2
  213.     BPL    WAIT130        ;+2/3
  214.     LDA    (MAZE2R),Y    ;41/43-46/48
  215.     STA    PF1        ;-49/51
  216.     INY            ;-53
  217.     CPY    #135        ;-55
  218.     BCC    KERN130        ;-57/58
  219.     LDX    #$00        ;-59
  220.     CPY    #150        ;-61
  221.     BNE    KERN130        ;-63/64
  222.     LDX    #$FF        ;-65
  223.  
  224. KERN150    STA    WSYNC        ;64-0
  225.     LDA    (MAZE1L),Y    ;-5
  226.     STA    PF1        ;-8
  227.     STX    PF2        ;-10
  228.     LDX    #4        ;-12
  229.     CPY    SKELBOT        ;-14
  230.     BCS    WAIT150        ;-16/17
  231.     LDA    (SKEL0),Y    ;-21
  232.     STA    GRP0        ;-24
  233.     LDA    (SKEL1),Y    ;-29
  234.     STA    GRP1        ;-32
  235.     LDX    #1        ;-34
  236. WAIT150    DEX            ;+2
  237.     BPL    WAIT150        ;+2/3
  238.     LDA    (MAZE1R),Y    ;41/43-46/48
  239.     STA    PF1        ;-49/51
  240.     INY            ;-53
  241.     CPY    #155        ;-55
  242.     BCC    KERN150        ;-57/58
  243.     LDX    #$00        ;-59
  244.     CPY    #170        ;-61
  245.     BNE    KERN150        ;-63/64
  246.     LDX    #$FF        ;-65
  247.  
  248. KERN170    STA    WSYNC        ;64-0
  249.     LDA    (MAZE0L),Y    ;-5
  250.     STA    PF0        ;-8
  251.     STX    PF1        ;-10
  252.     STX    PF2        ;-12
  253.     LDX    #5        ;-14
  254. WAIT170    DEX            ;+2
  255.     BPL    WAIT170        ;+2/3
  256.     LDA    (MAZE0R),Y    ;43-48
  257.     STA    PF0        ;-51
  258.     INY            ;-53
  259.     CPY    #175        ;-55
  260.     BCC    KERN170        ;-57/58
  261.     LDX    #$00        ;-59
  262.     CPY    #190        ;-61
  263.     BNE    KERN170        ;-63/64
  264.  
  265. LAST    LDA    #30*76/64+1
  266.     STA    WSYNC        ;-0
  267.     STA    TIM64T        ;-4
  268.     STX    PF0
  269.  
  270.     LDX    SOUNDEL        ; sound countdown
  271.     BEQ    COLUPA        ; already zero?
  272.     DEX
  273.     BNE    COLUPA        ; zero?
  274.     STX    AUDV0        ; turn off sound
  275.     STX    AUDV1
  276.  
  277. COLUPA    STX    SOUNDEL
  278.     LDA    SKELIFE        ; skeleton still alive?
  279.     BPL    COLUPB
  280.     LDX    FIREDEL
  281.     LDA    SKELDIE,X
  282.     BNE    COLUPC
  283.     BEQ    COLUPC
  284. COLUPB    LDA    FIREDEL        ; fire flash?
  285.     CMP    #55
  286.     BCS    FIRETST
  287.     LDA    MAZECOL        ; set playfield colour
  288.     STA    COLUPF
  289.     LDX    SKELIFE        ; set skeleton color
  290.     LDA    LIFELUM,X
  291. COLUPC    STA    COLUP0
  292.     STA    COLUP1
  293.  
  294. FIRETST    LDA    INPT4        ; fire button
  295.     AND    #$80
  296.     CMP    THISFIR        ; debounce
  297.     BNE    PLAYMOV        ; not the same
  298.     LDX    LASTFIR        ; check last button position
  299.     STA    LASTFIR        ; save current
  300.     BPL    PLAYMOV        ; do nothing if last was down
  301.     ASL            ; check current
  302.     BCS    PLAYMOV        ; do nothing if up
  303.     LDA    FIREDEL        ; check reload delay
  304.     BNE    PLAYMOV        ; do nothing if reloading
  305.     STA    AUDF0        ; BANG!
  306.     STA    AUDF1
  307.     LDA    #8        
  308.     STA    AUDC0
  309.     STA    AUDC1
  310.     STA    AUDV0
  311.     STA    AUDV1
  312.     STA    SOUNDEL
  313.     LDA    SKELDIS        ; is skeleton in view?
  314.     AND    #$03
  315.     BEQ    SETDEL        ; not in view
  316.     LDA    #$00        ; make skeleton turn
  317.     SEC            ; and face plaer
  318.     SBC    PLAYDIR
  319.     STA    SKELNXT
  320.     LDA    RANDOM        ; generate random damage
  321.     AND    #$0F        ; 0-15
  322.     STA    FIREDEL        ; save temp
  323.     LDA    SKELIFE        ; reduce skeleton life
  324.     SEC
  325.     SBC    FIREDEL
  326.     STA    SKELIFE
  327.     LDA    FIREDEL        ; set skeleton colour flash
  328.     ASL
  329.     ASL
  330.     ASL
  331.     ASL
  332.     STA    FIREDEL        ; save msn
  333.     LDX    SKELIFE        ; set luminance
  334.     LDA    LIFELUM,X
  335.     ORA    FIREDEL        ; combine
  336.     STA    COLUP0
  337.     STA    COLUP1
  338. SETDEL    LDA    MAZECOL        ; set playfield colour
  339.     AND    #$0F        ; flash maze too
  340.     STA    COLUPF
  341.     LDA    #60        ; set reload timer = 1 sec
  342.     STA    FIREDEL
  343.     BNE    PLAYMOV
  344.  
  345. PLAYMOV    LDA    SWCHA        ; PLAYER MOVE
  346.     ORA    #$0F
  347.     CMP    THISMOV        ; DEBOUNCE
  348.     BNE    SKELMOV
  349.     LDX    LASTMOV        ; moved last frame?
  350.     CPX    #$FF
  351.     BNE    PMOVEA        ; no
  352.     CMP    #$EF        ; forward?
  353.     BEQ    PMOVEC
  354.     CMP    #$7F        ; turn right?
  355.     BEQ    PMOVEB
  356.     CMP    #$BF        ; turn left?
  357.     BNE    SKELMOV
  358.     STA    LASTMOV        
  359.     LDX    PLAYDIR        ; turn left
  360.     LDA    #$00
  361.     SEC
  362.     SBC    PLAYRIG
  363.     STX    PLAYRIG
  364.     STA    PLAYDIR
  365.     BNE    SKELMOV
  366. PMOVEA    CMP    #$FF        ; return to center?
  367.     BNE    SKELMOV
  368.     STA    LASTMOV        ; centered
  369.     BEQ    SKELMOV
  370. PMOVEB    STA    LASTMOV        ; right turn
  371.     LDX    PLAYRIG
  372.     LDA    #$00
  373.     SEC
  374.     SBC    PLAYDIR
  375.     STX    PLAYDIR
  376.     STA    PLAYRIG
  377.     BNE    SKELMOV
  378. PMOVEC    STA    LASTMOV        ; step forward
  379.     LDA    WALL
  380.     CMP    #1
  381.     BEQ    SKELMOV
  382.     LDA    PLAYPOS
  383.     CLC
  384.     ADC    PLAYDIR
  385.     STA    PLAYPOS
  386.     CMP    SKELPOS
  387.     BNE    SKELMOV
  388.     JMP    GOTYOU
  389.  
  390. SKELMOV    LDA    SKELIFE        ; skeleton still alive?
  391.     BMI    SKELSTP
  392.     DEC    SKELDEL        ; main skeleton movement delay
  393.     BEQ    SKDEL1
  394. SKELSTP    JMP    BOTTOM        ; no movement, skip everything
  395.     
  396. SKDEL1    LDA    SKELSEC        ; decrease rate counter
  397.     SEC
  398.     SBC    SKELPER
  399.     STA    SKELSEC
  400.     BCS    SKDEL2        ; no carry = underflow
  401.     ADC    #60
  402.     STA    SKELSEC
  403.     LDA    SKELMIN
  404.     SEC
  405.     SBC    SKELPER        ; decrease square counter
  406.     STA    SKELMIN
  407.     BCS    SKDEL2        ; no carry = underflow
  408.     ADC    #87
  409.     STA    SKELMIN
  410.     LDA    SKELHRS
  411.     SEC
  412.     SBC    SKELPER        ; decrease cube counter
  413.     STA    SKELHRS
  414.     BCS    SKDEL2        ; no carry = underflow
  415.     ADC    #76
  416.     STA    SKELHRS
  417.     DEC    SKELPER        ; speed up skeleton!
  418. SKDEL2    LDA    SKELPER
  419.     STA    SKELDEL 
  420.  
  421.     LDA    SKELNXT        ; forced move?
  422.     BEQ    SMOVEA        ; nope, start the decision tree
  423.     LDX    #0        ; clear forced move flag
  424.     STX    SKELNXT
  425.     CMP    SKELDIR        ; forced=facing?
  426.     BNE     SKNXT0
  427.     JMP    SMOVE1        ; step forward
  428. SKNXT0    STA    SKELDIR        ; turn and set SKELRIG correctly
  429.     CMP    #1
  430.     BEQ    SKNXT1
  431.     BMI    SKNXT2
  432.     LDA    #-1
  433.     STA    SKELRIG
  434.     BNE    SKELSTP
  435. SKNXT1    LDA    #16
  436.     STA    SKELRIG
  437.     BNE    SKELSTP
  438. SKNXT2    CMP    #-1
  439.     BEQ    SKNXT3
  440.     LDA    #1
  441.     STA    SKELRIG
  442.     BNE    SKELSTP
  443. SKNXT3    LDA    #-16
  444.     STA    SKELRIG
  445.     BNE    SKELSTP
  446. SMOVEA    LDX    #0        ; direction flags
  447.     LDA    SKELPOS        ; can we go forward?
  448.     CLC
  449.     ADC    SKELDIR
  450.     TAY
  451.     LDA    LVLMASK
  452.     AND    MAZES,Y
  453.     BNE    SMOVED        ; can't go forward
  454.     INX            ; forward flag
  455.     LDA    #$01        ; determine facing
  456.     BIT    SKELDIR        ; use bit to test for neg too
  457.     BNE    SMOVEB        ; SKELDIR = +1/-1
  458.     LDA    PLAYPOS        ; check for player in same column
  459.     SEC
  460.     SBC    SKELPOS
  461.     AND    #$0F
  462.     BNE    SMOVED
  463.     JMP    SMOVE1
  464. SMOVEB    BMI    SMOVEC        ; SKELDIR = -1
  465.     LDA    PLAYPOS
  466.     SEC
  467.     SBC    SKELPOS
  468.     AND    #$F0        ; player ahead
  469.     BNE    SMOVED
  470.     JMP    SMOVE1
  471. SMOVEC    LDA    SKELPOS        ; player ahead (behind)
  472.     SEC
  473.     SBC    PLAYPOS
  474.     AND    #$F0        ; player ahead
  475.     BNE    SMOVED
  476.     BEQ    SMOVE1
  477. SMOVED    LDA    SKELPOS        ; can we go right?
  478.     CLC
  479.     ADC    SKELRIG
  480.     TAY
  481.     LDA    LVLMASK
  482.     AND    MAZES,Y
  483.     BNE    SMOVEE
  484.     INX
  485.     INX
  486. SMOVEE    LDA    SKELPOS        ; can we go left?
  487.     SEC
  488.     SBC    SKELRIG
  489.     TAY
  490.     LDA    LVLMASK
  491.     AND    MAZES,Y
  492.     BNE    SMOVEF
  493.     INX
  494.     INX
  495.     INX
  496.     INX
  497. SMOVEF    CPX    #0
  498.     BEQ    SMOVE0        ; no directions, turn around
  499.     DEX    
  500.     BEQ    SMOVE1        ; forward only
  501.     DEX
  502.     BEQ    SMOVE2        ; right only
  503.     DEX
  504.     BEQ    SMOVE3        ; right or forward
  505.     DEX
  506.     BEQ    SMOVE4        ; left only
  507.     DEX
  508.     BEQ    SMOVE5        ; left or forward
  509.     DEX
  510.     BEQ    SMOVE6        ; right or left
  511.     BIT    RANDOM        ; all directions    
  512.     BPL    SMOVE1
  513.     BMI    SMOVE6
  514. SMOVE0    LDA    #$00        ; turn around
  515.     SEC
  516.     SBC    SKELDIR
  517.     STA    SKELDIR
  518.     LDA    #$00
  519.     SEC
  520.     SBC    SKELRIG
  521.     STA    SKELRIG
  522.     JMP    BOTTOM
  523. SMOVE2    LDX    SKELRIG        ; turn right
  524.     LDA    #$00
  525.     SEC
  526.     SBC    SKELDIR
  527.     STX    SKELDIR
  528.     STA    SKELRIG
  529.     STX    SKELNXT        ; force forward
  530.     JMP    BOTTOM
  531. SMOVE3    BIT    RANDOM
  532.     BPL    SMOVE1
  533.     BMI    SMOVE2
  534. SMOVE4    LDX    SKELDIR        ; turn left
  535.     LDA    #$00
  536.     SEC
  537.     SBC    SKELRIG
  538.     STX    SKELRIG
  539.     STA    SKELDIR
  540.     STA    SKELNXT        ; force forward
  541.     JMP    BOTTOM
  542. SMOVE5    BIT    RANDOM
  543.     BPL    SMOVE1
  544.     BMI    SMOVE4
  545. SMOVE6    BIT    RANDOM
  546.     BVC    SMOVE2
  547.     BVS    SMOVE4
  548. SMOVE1    LDA    SKELPOS        ; step forward
  549.     CLC
  550.     ADC    SKELDIR
  551.     STA    SKELPOS
  552.     CMP    PLAYPOS
  553.     BNE    SMOVE7
  554.     JMP    GOTYOU
  555. SMOVE7    LDA    SOUNDEL        ; check for existing sound
  556.     BNE    BOTTOM
  557.     JSR    SKPOSXY        ; calculate distance for sound
  558.     JSR    SKSTEP
  559.     LDA    #1
  560.     STA    AUDC0
  561.     STA    AUDC1
  562.     LDA    RANDOM
  563.     ORA    #30
  564.     STA    AUDF0
  565.     STA    AUDF1
  566.     CPX    #-15
  567.     BPL    AUDX
  568.     LDX    #-15
  569. AUDX    STX    AUDV0        ; left speaker
  570.     STX    COLUP0
  571.     CPY    #-15
  572.     BPL    AUDY
  573.     LDY    #-15
  574. AUDY    STY    AUDV1        ; right speaker
  575. ;    STY    COLUP1
  576.     LDA    SKELDEL
  577.     LSR
  578.     STA    SOUNDEL
  579.  
  580. BOTTOM    JSR    WAITIM
  581.  
  582.     LDA    #$02
  583.     STA    VSYNC
  584.     JSR    RAND        ; cycle LFSR
  585.     LDA    #$01
  586.     STA    CTRLPF        ; reflect playfield
  587.  
  588.     STA    WSYNC        ; set initial skeleton position
  589.     LDX    #8        ;-2
  590. SKPOS    DEX            ;+2
  591.     BNE    SKPOS        ;+2/3
  592.     STA    RESP0        ;46-49
  593.     LDA    #$60        ; shift left half left
  594.     STA    RESP1
  595.     STA    HMP0
  596.     LDA    #$40        ; center right half (final position)
  597.     STA    HMP1
  598.     STA    WSYNC    
  599.     STA    HMOVE
  600.  
  601.     LDA    #38*76/64+1
  602.     STA    WSYNC
  603.     STA    TIM64T
  604.     LDA    #$00
  605.     STA    VSYNC
  606.     STA    HMCLR
  607.  
  608. NEWSKEL    LDA    SKELIFE        ; skeleton dead?
  609.     BPL    PVIEW
  610.     LDA    FIREDEL        ; done death flash?
  611.     BNE    PVIEW
  612.     LDX    SKELNUM        ; increment skeleton life
  613.     INX
  614.     STX    SKELNUM
  615.     STX    SKELIFE
  616.     LDX    MAZECOL        ; increment maze luminance
  617.     INX
  618.     TXA
  619.     AND    #$0F
  620.     CMP    #13
  621.     BEQ    NEXTLVL        ; ten down, new level
  622.     STX    MAZECOL
  623.     LDA    #$00
  624.     STA    SKELPOS
  625.     JSR    SKPOSXY        ; figure out restart position
  626. ;    LDA    SKELX
  627.     BPL    NEWSK1
  628.     EOR    #$FF        ; NEG
  629.     CLC
  630.     ADC    #$01
  631. NEWSK1    BIT    SKELY
  632.     BPL    NEWSK2
  633.     SEC
  634.     SBC    SKELY
  635.     BPL    NEWSK3
  636. NEWSK2    CLC
  637.     ADC    SKELY
  638. NEWSK3    CMP    #$07
  639.     BPL    NEWSK4
  640.     LDA    #120
  641.     STA    SKELPOS
  642. NEWSK4    LDX    #LOADDEL-LOADRAM; reset skeleton move timers
  643.     BNE    REINIT
  644. NEXTLVL    TXA            ; increment maze colour
  645.     CLC
  646.     ADC    #$16
  647.     STA    MAZECOL
  648.     LDX    #LOADLVL-LOADRAM
  649.     ASL    LVLMASK
  650.     BNE    REINIT
  651.     JMP    YOUWIN
  652.  
  653. REINIT    LDA    LOADRAM-1,X    ; refresh initial values
  654.     STA    RAMLOAD-1,X
  655.     DEX
  656.     BNE    REINIT
  657.  
  658. PVIEW    LDX    #0        ; center view & skeleton distance
  659.     STX    SKELDIS
  660.     LDY    PLAYPOS
  661.     JSR    PVIEW1
  662.     BNE    PVIEWA
  663.     JSR    PVIEW1
  664.     BNE    PVIEWA
  665.     JSR    PVIEW1
  666.     BNE    PVIEWA
  667.     JSR    PVIEW1
  668.     BNE    PVIEWA
  669.     INX
  670. PVIEWA    STX    WALL        ; save wall distance
  671.     LDA    PLAYPOS        ; right view, step 1
  672.     CLC
  673.     ADC    PLAYRIG
  674.     LDX    #MAZE1R+1    ; save bits here
  675. PVIEWE    JSR    PVIEW3        ; test and save bits
  676.     CPX    #MAZE3R+2
  677.     BNE    PVIEWE
  678.     LDA    PLAYPOS        ; left view, step 1
  679.     SEC            ;
  680.     SBC    PLAYRIG        ;
  681.     LDX    #MAZE1L+1    ; save bits here
  682. PVIEWF    JSR    PVIEW3        ;
  683.     CPX    #MAZE3L+2    ;
  684.     BNE    PVIEWF        ;
  685.     LDX    #MAZE1R+1    ; right view, step 2
  686.     LDY    #MAZE0R        ; 
  687. PVIEWG    JSR    PVIEW4        ; change bits to pointers
  688.     CPY    #MAZE3R+2    ;
  689.     BNE    PVIEWG        ;
  690.     LDX    #MAZE1L+1    ; left view, step 2
  691.     LDY    #MAZE0L        ;
  692. PVIEWH    JSR    PVIEW4        ; change bits to pointers
  693.     CPY    #MAZE3L+2    ;
  694.     BNE    PVIEWH        ;
  695.  
  696.     LDA    SKELDIS        ; skeleton view
  697.     AND    #$03        ; check distance
  698.     BNE    SKPOSA
  699.     STA    SKELBOT        ; force skeleton off
  700.     SBC    #1        ; by reversing top & bottom
  701.     STA    SKELTOP
  702.     JMP    SKVIEW
  703. SKPOSA    SEC            ; decrement for table access
  704.     SBC    #1
  705.     ASL            ; multiply by 16
  706.     ASL
  707.     ASL
  708.     ASL
  709.     TAY
  710.     LDA    SKTABLE,Y    ; use table to update RAM
  711.     STA    HMP0
  712.     LDA    SKTABLE+1,Y
  713.     STA    SKELTOP
  714.     LDA    SKTABLE+2,Y
  715.     STA    SKELBOT
  716.     LDA    SKTABLE+3,Y
  717.     STA    NUSIZ0
  718.     STA    NUSIZ1
  719.     LDA    PLAYDIR        ; figure out facing
  720.     CMP    SKELDIR
  721.     BEQ    SKPOSB        ; same dir = back
  722.     CMP    SKELRIG        ; left
  723.     BEQ    SKPOSC
  724.     CLC
  725.     ADC    SKELDIR
  726.     BEQ    SKPOSD        ; inverse = front
  727.     LDA    SKTABLE+8,Y    ; must be right
  728.     STA    SKEL1        ; arm on the right
  729.     LDA    SKTABLE+9,Y
  730.     STA    SKEL1+1
  731.     LDA    SKTABLE+10,Y    ; body on the left
  732.     STA    SKEL0
  733.     LDA    SKTABLE+11,Y
  734.     STA    SKEL0+1
  735.     LDA    #$18        ; mirror both
  736.     BNE    SKVIEW
  737. SKPOSB    LDA    SKTABLE+6,Y    ; back for both
  738.     STA    SKEL0        
  739.     STA    SKEL1        
  740.     LDA    SKTABLE+7,Y    
  741.     STA    SKEL0+1        
  742.     STA    SKEL1+1        
  743.     LDA    #$08        ; left normal, right mirror
  744.     BNE    SKVIEW
  745. SKPOSC    LDA    SKTABLE+8,Y    ; arm on the left
  746.     STA    SKEL0
  747.     LDA    SKTABLE+9,Y
  748.     STA    SKEL0+1
  749.     LDA    SKTABLE+10,Y    ; body on the right
  750.     STA    SKEL1
  751.     LDA    SKTABLE+11,Y
  752.     STA    SKEL1+1
  753.     LDA    #$00        ; no mirror
  754.     BEQ    SKVIEW
  755. SKPOSD    LDA    SKTABLE+4,Y    ; front for both
  756.     STA    SKEL0
  757.     STA    SKEL1
  758.     LDA    SKTABLE+5,Y
  759.     STA    SKEL0+1
  760.     STA    SKEL1+1
  761.     LDA    #$08        ; left normal, right mirror
  762. SKVIEW    STA    WSYNC        ; hmove P0 for size
  763.     STA    HMOVE
  764.     STA    REFP1        ; set reflection registers
  765.     LSR
  766.     STA    REFP0
  767.     STA    WSYNC
  768.     STA    HMOVE
  769.  
  770.     JSR    WAITIM
  771.  
  772.     LDA    INPT4        ; save button for debounce
  773.     AND    #$80
  774.     STA    THISFIR
  775.     LDX    FIREDEL        ; decrement reload counter
  776.     BEQ    RELOAD
  777.     DEX
  778.     STX    FIREDEL
  779.  
  780. RELOAD    LDA    SWCHA        ; save joystick for debounce
  781.     ORA    #$0F
  782.     STA    THISMOV
  783.  
  784.     LDY    #$00
  785.     LDX    #$00
  786.     JMP    KERN0
  787.  
  788. PVIEW1    INX            ; center view subroutine
  789.     TYA            ; move forward one step
  790.     CLC
  791.     ADC    PLAYDIR
  792.     CMP    SKELPOS        ; check skeleton position
  793.     BNE    PVIEW2
  794.     STX    SKELDIS        ; save if found
  795. PVIEW2    TAY            ; check for wall
  796.     LDA    LVLMASK
  797.     AND    MAZES,Y        ; BNE done after return
  798.     RTS
  799.  
  800. PVIEW3    TAY            ; right/left step 1 subroutine
  801.     LDA    LVLMASK        ; move bits from ROM to RAM
  802.     AND    MAZES,Y
  803.     STA    $00,X
  804.     INX
  805.     TYA
  806.     CLC            ; move forward one step
  807.     ADC    PLAYDIR
  808.     RTS
  809.  
  810. SKPOSXY    LDA    SKELPOS        ; change SKPOS-PLAYPOS to SKELX+SKELY
  811.     SEC
  812.     SBC    PLAYPOS
  813.     STA    SKELX
  814.     LSR
  815.     LSR
  816.     LSR
  817.     LSR
  818.     BIT    TESTBIT        ; negative?
  819.     BEQ    SKXY2
  820.     ORA    #$F0
  821. SKXY2    STA    SKELY
  822.     LDA    SKELX
  823.     BIT    TESTBIT        ; negative?
  824.     BEQ    SKXY3
  825.     INC    SKELY
  826.     ORA    #$F0
  827.     BMI    SKXY4
  828. SKXY3    AND    #$0F
  829. SKXY4    STA    SKELX
  830.     RTS
  831.  
  832. SKSTEP    LDA    #$01
  833.     BIT    PLAYDIR
  834.     BEQ    SKSTEPG        ; PLAYDIR = 16 or -16
  835.     BMI    SKSTEPD        ; PLAYDIR = -1
  836.     LDA    SKELX        ; PLAYDIR = 1
  837.     BMI    SKSTEPA        ; skeleton behind
  838.     EOR    #$FF        ; NEG
  839.     CLC
  840.     ADC    #$01
  841.     BMI    SKSTEPB
  842. SKSTEPA    ASL            ; multiply by 2
  843. SKSTEPB    STA    SKELX
  844.     LDA    SKELY
  845.     BPL    SKSTEPC        ; skeleton right
  846.     CLC
  847.     ADC    SKELX
  848.     TAX            ; left = X + Y
  849.     CLC
  850.     ADC    SKELY
  851.     TAY            ; right = X + 2Y
  852.     RTS
  853. SKSTEPC    LDA    SKELX
  854.     SEC
  855.     SBC    SKELY
  856.     TAY            ; right = X - Y
  857.     SEC
  858.     SBC    SKELY
  859.     TAX            ; left = X - 2Y
  860.     RTS
  861. SKSTEPD    LDA    SKELX        ; PLAYDIR = -1
  862.     BMI    SKSTEPE        ; skeleton ahead
  863.     EOR    #$FF        ; NEG
  864.     CLC
  865.     ADC    #$01
  866.     ASL            ; multiply by 2
  867.     STA    SKELX
  868. SKSTEPE    LDA    SKELY
  869.     BPL    SKSTEPF        ; skeleton left
  870.     CLC
  871.     ADC    SKELX
  872.     TAY            ; right = X + Y
  873.     CLC
  874.     ADC    SKELY
  875.     TAX            ; left = X + 2Y
  876.     RTS
  877. SKSTEPF    LDA    SKELX
  878.     SEC
  879.     SBC    SKELY
  880.     TAX            ; left = X - Y
  881.     SEC
  882.     SBC    SKELY
  883.     TAY            ; right = X - 2Y
  884.     RTS
  885. SKSTEPG    BMI    SKSTEPK        ; PLAYDIR = -16
  886.     LDA    SKELY        ; PLAYDIR = 16
  887.     BMI    SKSTEPH        ; skeleton behind
  888.     EOR    #$FF        ; NEG
  889.     CLC
  890.     ADC    #$01
  891.     BMI    SKSTEPI
  892. SKSTEPH    ASL            ; multiply by 2
  893. SKSTEPI    STA    SKELY
  894.     LDA    SKELX
  895.     BPL    SKSTEPJ        ; skeleton left
  896.     CLC
  897.     ADC    SKELY
  898.     TAY            ; right = Y + X
  899.     CLC
  900.     ADC    SKELX
  901.     TAX            ; left = Y + 2X
  902.     RTS
  903. SKSTEPJ    LDA    SKELY
  904.     SEC
  905.     SBC    SKELX
  906.     TAX            ; left = Y - X
  907.     SEC
  908.     SBC    SKELX
  909.     TAY            ; right = Y - 2X
  910.     RTS
  911. SKSTEPK    LDA    SKELY        ; PLAYDIR = -16
  912.     BMI    SKSTEPL        ; skeleton ahead
  913.     EOR    #$FF        ; NEG
  914.     CLC
  915.     ADC    #$01
  916.     ASL            ; multiply by 2
  917.     STA    SKELY
  918. SKSTEPL    LDA    SKELX
  919.     BPL    SKSTEPM        ; skeleton left
  920.     CLC
  921.     ADC    SKELY
  922.     TAX            ; left = Y + X
  923.     CLC
  924.     ADC    SKELX
  925.     TAY            ; right = Y + 2X
  926.     RTS
  927. SKSTEPM    LDA    SKELY
  928.     SEC
  929.     SBC    SKELX
  930.     TAY            ; right = Y - X
  931.     SEC
  932.     SBC    SKELX
  933.     TAX            ; left = Y - 2X
  934.     RTS
  935.                 ; simple 8 bit LFSR
  936. RAND    LDA    RANDOM        ;+3
  937.     BEQ    XSEED        ;+5/6
  938.     LSR            ;+7
  939.     BCC    SRAND        ;+9/10
  940. XSEED    EOR    #$A9        ;+6/9-8/11
  941. SRAND    STA    RANDOM        ;+8/10/11-11/14
  942.     RTS            ;+17/20
  943.  
  944. WAITIM    STA    WSYNC        ;-0
  945.     LDA    INTIM        ;-4
  946.     BNE    WAITIM        ; wait for bottom of frame
  947.     RTS
  948.  
  949. XWALL0    STA    WSYNC        ;-0
  950. XWALL    CPY    SKELTOP        ;-2
  951.     BCC    XWALL1        ;-4/5
  952.     CPY    SKELBOT        ;-6
  953.     BCS    XWALL1        ;-8/9
  954.     LDA    (SKEL0),Y    ;-13
  955.     STA    GRP0        ;-16
  956.     LDA    (SKEL1),Y    ;-21
  957.     STA    GRP1        ;-24
  958. XWALL1    INY            ;-26
  959.     DEX            ;-28
  960.     BNE    XWALL0        ;-30/31
  961.     RTS            ;-36
  962.  
  963. START    SEI            ; enable interupts
  964.     CLD            ; turn off BCD math
  965.     LDA    #$00        ; clear zero page memory & registers
  966.     LDX    #$44        ; start with the TIA shadow
  967. NULL    STA    0,X
  968.     INX
  969.     BNE    NULL
  970.     DEX            ; set stack to bottom of RAM
  971.     TXS
  972.  
  973.     STX    COLUPF        ; set up title screen
  974.     LDX    #<GOT
  975.     STX    TITLEND
  976.     LDX    #<TITLEPF
  977.     STX    TITLEX
  978.     LDY    #11
  979.     STY    TITLEY
  980.     LDA    #32*76/64+1
  981.     STA    TITLBOT
  982.     LDA    #41*76/64+1
  983.     STA    TITLTOP
  984.  
  985. TITLE3    LDA    #$02
  986.     STA    VSYNC
  987.     STA    WSYNC
  988.     JSR    RAND        ; cycle LFSR
  989.     STA    WSYNC    
  990.     LDA    TITLTOP
  991.     STA    WSYNC
  992.     STA    TIM64T
  993.     LDA    #$00
  994.     STA    VSYNC
  995.     LDX    TITLEX
  996. TITLE2    JSR    WAITIM
  997.  
  998. TITLE    STA    WSYNC
  999.     LDA    TITLEPF+1,X    ;-4
  1000.     STA    PF1        ;-7
  1001.     LDA    TITLEPF+2,X    ;-11
  1002.     STA    PF2        ;-14
  1003.     LDA    TITLEPF,X    ;-18
  1004.     STA    PF0        ;-21
  1005.     ASL            ;-23
  1006.     ASL            ;-25
  1007.     ASL            ;-27
  1008.     ASL            ;-31
  1009.     STA    PF0        ;-34
  1010.     LDA    TITLEPF+3,X    ;-38
  1011.     STA    PF1        ;-41
  1012.     LDA    TITLEPF+4,X    ;-45
  1013.     DEY            ;-47
  1014.     BNE    TITLE0        ;-49/50
  1015.     LDY    TITLEY        ;-52
  1016.     INX            ;-54
  1017.     INX            ;-56
  1018.     INX            ;-58
  1019.     INX            ;-60
  1020.     INX            ;-62
  1021. TITLE0    STA    PF2        ;50/62-53/65
  1022.     CPX    TITLEND        ;-67
  1023.     BNE    TITLE        ;-69/70
  1024.  
  1025.     LDA    TITLBOT        ;-72
  1026.     STA    WSYNC        ;-0
  1027.     STA    TIM64T        ;-4
  1028.     LDA    #0
  1029.     STA    PF0
  1030.     STA    PF1
  1031.     STA    PF2
  1032.     STA    AUDV0
  1033.     STA    AUDV1
  1034.     LDA    SWCHB        ; check reset/select
  1035.     AND    #$03
  1036.     CMP    #$03
  1037.     BNE    INIT
  1038. TITLE1    JSR    WAITIM
  1039.     BEQ    TITLE3
  1040.  
  1041. YOUWIN    LDX    #<SKBODY3
  1042.     STX    TITLEND
  1043.     LDx    #<YOU
  1044.     STX    TITLEX
  1045.     LDY    #15
  1046.     STY    TITLEY
  1047.     LDA    #42*76/64+1
  1048.     STA    TITLBOT
  1049.     LDA    #49*76/64+1
  1050.     STA    TITLTOP
  1051.     BNE    TITLE2
  1052.  
  1053. GOTYOU    LDX    #<WIN-5
  1054.     STX    TITLEND
  1055.     LDX    #<GOT
  1056.     STX    TITLEX
  1057.     LDY    #15
  1058.     STY    TITLEY
  1059.     LDA    #42*76/64+1
  1060.     STA    TITLBOT
  1061.     LDA    #49*76/64+1
  1062.     STA    TITLTOP
  1063.     BNE    TITLE1
  1064.     
  1065. INIT    LDX    #LOADEND-LOADRAM
  1066. INITL    LDA    LOADRAM-1,X    ; copy in initial values
  1067.     STA    RAMLOAD-1,X
  1068.     DEX
  1069.     BNE    INITL
  1070.     JMP    LAST
  1071.  
  1072.     INCLUDE "SKELDATA.ASM"
  1073.  
  1074.     ORG    $1FFC        ; end of 4K cart
  1075.     DC.W    START        ; reset vector
  1076.     DC.W    START        ; IRQ vector
  1077.